package main

import (
	"fmt"
	"time"
)

func main() {
	//numsChan := make(chan int,10)
	//1.当缓存写满的时候，写阻塞，当被读取后，再恢复写入
	//2.当缓冲区读取完毕，读阻塞
	//3.如果管道没有使用make分配空间，那么管道默认是nil的，读取、写入都会阻塞

	var names chan string

	names = make(chan string, 10)
	go func() {
		fmt.Println("names:", <-names)
	}()
	names <- "hello" //由于names是nil的，写操作会阻塞在这里
	time.Sleep(1 * time.Second)

	numChan1 := make(chan int, 10)
	//写
	go func() {
		for i := 0; i < 50; i++ {
			numChan1 <- i
			fmt.Println("写入数据", i)
		}
	}()
	//读,当主程序被管道阻塞时，那么程序将锁死崩溃
	//要求我们读写保持一致
	go func() {
		for i := 0; i < 60; i++ {
			fmt.Println("主程序准备读取数据......")
			data := <-numChan1
			fmt.Println("读出数据", data)
		}
	}()
	for {
		fmt.Println("这是主go程，正在死循环")
		time.Sleep(1 * time.Second)
	}
}
